import subprocess, re, time, base64, requests
from pathlib import Path
from IPython.display import display, HTML, clear_output
class Aria2Setup:
def __init__(self, download_dir):
self.output_dir = f"/content/drive/MyDrive/{download_dir}"
self.tunnel_url = None
Path(self.output_dir).mkdir(parents=True, exist_ok=True)
def run_silent(self, cmd):
return subprocess.run(cmd, shell=True, capture_output=True, text=True)
def get_trackers(self):
try:
res = requests.get("https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt", timeout=5)
return res.text.strip().replace('\n\n', ',').replace('\n', ',') if res.ok else ""
except:
return ""
def setup_aria2(self):
print("⚙️ Setting up aria2...")
self.run_silent("wget -q https://github.com/aria2/aria2/releases/download/release-1.37.0/aria2-1.37.0.tar.gz -O a.tgz && tar xf a.tgz && mv aria2c /usr/local/bin/ && rm a.tgz")
trackers = self.get_trackers()
cmd = (
f"aria2c --enable-rpc --rpc-listen-port=6800 --rpc-secret=88888888 "
f"--rpc-allow-origin-all=true -D -d {self.output_dir} -j 20 -c "
f"{'--bt-tracker=' + trackers + ' ' if trackers else ''}"
f"--bt-request-peer-speed-limit=0 --bt-max-peers=0 --seed-ratio=0.0 "
f"--max-connection-per-server=10 --min-split-size=10M --follow-torrent=mem "
f"--disable-ipv6=true --file-allocation=falloc --http-accept-gzip=true "
f"--user-agent='Transmission/2.77' --peer-agent='Transmission/2.77' "
f"--peer-id-prefix=-TR2770- --split=20"
)
subprocess.Popen(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
time.sleep(2)
def setup_cloudflared(self):
print("🌐 Setting up tunnel...")
self.run_silent("wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && dpkg -i cloudflared-linux-amd64.deb 2>/dev/null && rm cloudflared-linux-amd64.deb")
def start_tunnel(self):
process = subprocess.Popen(
"cloudflared tunnel --url localhost:6800",
shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
)
url_pattern = re.compile(r'https://[a-z0-9-]+\.trycloudflare\.com')
for _ in range(30):
line = process.stderr.readline()
match = url_pattern.search(line)
if match:
self.tunnel_url = match.group(0)
break
time.sleep(1)
return process
def get_ariang_url(self):
if not self.tunnel_url:
return None
hostname = self.tunnel_url.replace('https://', '')
secret = base64.b64encode("88888888".encode()).decode()
return f"https://ariang.mayswind.net/latest/#!/settings/rpc/set?protocol=wss&host={hostname}&port=443&interface=jsonrpc&secret={secret}"
def display_result(self):
ariang_url = self.get_ariang_url()
if not ariang_url:
print("❌ Failed to get tunnel URL")
return
clear_output(wait=True)
display(HTML(f'''
'''))
def run(self):
"""Main execution"""
try:
self.setup_aria2()
self.setup_cloudflared()
process = self.start_tunnel()
self.display_result()
process.wait()
except KeyboardInterrupt:
clear_output()
print("🛑 Stopped")
except Exception as e:
print(f"❌ Error: {e}")
if __name__ == "__main__":
DOWNLOAD_DIR = input("Enter download directory name: ")
setup = Aria2Setup(DOWNLOAD_DIR)
setup.run()